/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) 李文友 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef ROBOTIO_H
#define ROBOTIO_H

#include <QString>
#include <QVector>
#include <QMap>
#include <QDebug>
#include "domparser.h"
#include "ecatio.h"
#include "gSoapFoundation/soapStub.h"
#include <string>
#define EMSTOP1_INDEX 0
#define EMSTOP2_INDEX 1
#define SERVOON_INDEX 2

#define SUCCESS  0
#define FAILED -1

/**
 * @brief The IoValueType enum 映射数据类型
 */
enum IoValueType{
    E_IoValueType_NULL, //0 留空，不映射
    E_IoValueType_DI,
    E_IoValueType_DO,
    E_IoValueType_AI,
    E_IoValueType_AO,
    E_IoValueType_SI,
    E_IoValueType_SO,
};



/**
 * @brief The IoMap struct ///单独一个io的配置
 */
struct IoMap{
    unsigned int nodeId;//ID, 别名
    int valueType;//状态 ,  si ,so ,di,do ,ai ,ao
    int deviceValueIndex;//物理IO索引
    int logicValueIndex;//逻辑IO索引
    int devType;//设备类型
    E_DEVICE_PROTOCOL deviceProtocol;//设备协议
    QString note;//描述
};


/**
 * @brief The RobotIo class IO读写类
 *
 */
class RobotIo : public DomParser
{
public:
    RobotIo(QString configFilePathIn);

public:
    int get_All_IO_NamesInfo( struct IOMapNamesInfo &nameOut);
    int set_IO_NameInfo( int IOValueTypeIn, int logicValueIndexIn, std::string nameIn, int &returnFlag);
    bool isInitialStatus();

    /**
   * @brief readXmlConfig ///读取映射配置文件
   * @return
   */
    int readXmlConfig(QString filepath );


    int getEmergencyDi(bool &emStop1,bool &emStop2);

    int getServoOnDi(bool &servoOnDi);


    unsigned short getDi_short(int shortIndex);//返回１６ｂｉｔｄｉ
    unsigned short getDo_short(int shortIndex);//返回１６ｂｉｔｄo
    bool  getDi(int index);
    bool  getDo(int index);
    bool setDi(int index,bool valueIn);
    int setDoVector(unsigned short doListIn, unsigned short doValidMask);

    bool  getSi(int index);

    bool  getSo(int index);

    double getAi(int index);

    bool  setDo(int index, bool val);

    bool  setSo(int index, bool val);

    bool  setAo(int index, double val);


    void updateLv3(
            std::vector<bool> &_ioDi,
            std::vector<bool> &_ioDo,
            std::vector<bool> &_ioSi,
            std::vector<bool> &_ioSo,
            std::vector<double> &_ioAi,
            std::vector<double> &_ioAo );

    //----------------------------------------------------------
private:
    int initialIo(int itemCount);




public:
    int diCount;//逻辑层IO
    int doCount;//逻辑层IO
    int siCount;//逻辑层IO
    int soCount;//逻辑层IO
    int aiCount;//逻辑层IO
    int aoCount;//逻辑层IO

    unsigned char ioDi[D_MAX_IO_INDEX];
    unsigned char ioDo[D_MAX_IO_INDEX];
    unsigned char ioSi[D_MAX_IO_INDEX];
    unsigned char ioSo[D_MAX_IO_INDEX];
    double ioAi[D_MAX_IO_INDEX];
    double ioAo[D_MAX_IO_INDEX];


    /**
    * @brief allIoMap  /////所有io映射
    */
    QVector<IoMap> allIoMap;

    ///AI ,AO,SI,SO,DI,SO 映射分类 ,指向 allIoMap;
    QVector<IoMap*> ioDiMap;
    QVector<IoMap*> ioDoMap;
    QVector<IoMap*> ioSiMap;
    QVector<IoMap*> ioSoMap;
    QVector<IoMap*> ioAiMap;
    QVector<IoMap*> ioAoMap;

private:
    bool isInitialOk;
    QString configFilePath;


};



//#if D_IO_USE_VECTOR
//    //use vector
//    bool  getDi(int index){
//        if(index>ioDi.size())
//            return 0;
//        return ioDi[index];
//    }

//    float getAi(int index){
//        if(index>ioAi.size())
//            return 0;
//        return ioAi[index];
//    }

//    void  setDo(int index, bool val){
//        if(index>ioDo.size())
//            return;
//        ioDo[index]=val;
//    }

//    void  setAo(int index, float val){
//        if(index>ioAo.size())
//            return;
//        ioAo[index]=val;
//    }

//    void updateLv3(
//            QVector<bool> &_ioDi,
//            QVector<bool> &_ioDo,
//            QVector<bool> &_ioSi,
//            QVector<bool> &_ioSo,
//            QVector<float> &_ioAi,
//            QVector<float> &_ioAo )
//    {
//        _ioDi=ioDi;
//        _ioDo=ioDo;
//        _ioSi=ioSi;
//        _ioSo=ioSo;
//        _ioAi=ioAi;
//        _ioAo=ioAo;
//    }

//    ///逻辑层IO (内部已经初始化大小，禁止外界修改大小，使用时应当注意不要越界, 而且读和写都必须加锁)
//    QVector<bool> ioDi;
//    QVector<bool> ioDo;
//    QVector<bool> ioSi;
//    QVector<bool> ioSo;
//    QVector<float> ioAi;
//    QVector<float> ioAo;

//#else

#endif // ROBOTIO_H
